package com.biz.primus.ms.sms.dao.redis;

import com.biz.primus.base.redis.CrudRedisDao;
import com.biz.primus.model.misc.enums.SMSType;
import com.biz.primus.ms.sms.dao.ro.SmsRo;
import org.apache.commons.collections.MapUtils;
import org.springframework.stereotype.Repository;

import java.util.Map;

/**
 * 类说明：短信服务RedisDao
 *
 * @author xiaoyasong
 * @version 创建时间：2017年1月5日 下午3:44:37
 * @E-mail:yasong.xiao@biz-united.com.cn
 */
@Repository
public class SmsRedisDao extends CrudRedisDao<SmsRo, Long> {

    /**
     * 方法说明:保存短信验证码并设置有效时间
     *
     * @param mobile
     * @param smsType
     * @param code
     * @param validTimeInSecond 有效时间
     * @author xiaoyasong
     * @version 2017年1月5日
     */
    public void saveSMSCodeAndAutoExpire(String mobile, SMSType smsType, String code, int validTimeInSecond) {
        this.hmset(getKey(mobile, smsType), new SmsRo(System.currentTimeMillis(), code, System.currentTimeMillis()).toMap());
        this.expire(getKey(mobile, smsType), validTimeInSecond);
    }

    /**
     * 方法说明:查询短信服务
     *
     * @param mobile
     * @param smsType
     * @return
     * @author xiaoyasong
     * @version 2017年1月5日
     */
    public SmsRo findSMSCode(String mobile, SMSType smsType) {
        String key = getKey(mobile, smsType);
        Map<byte[], byte[]> data = this.hgetAll(key);
        logger.debug("find sms code,redis key={}", key);
        if (MapUtils.isNotEmpty(data)) {
            SmsRo smsRo = new SmsRo();
            smsRo.fromMap(data);
            return smsRo;
        }
        return null;
    }

    /**
     * 方法说明:删除短信服务
     *
     * @param mobile
     * @param smsType
     * @author xiaoyasong
     * @version 2017年1月5日
     */
    public void deleteSMSCode(String mobile, SMSType smsType) {
        this.del(getKey(mobile, smsType));
    }

    /**
     * 方法说明:提供手机号以及短信模板
     *
     * @param mobile
     * @param smsType
     * @return
     * @author xiaoyasong
     * @version 2017年1月5日
     */
    private String getKey(String mobile, SMSType smsType) {
        return getKeyByParams(mobile, smsType);
    }
}
